package TokenRecognizer;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author jefoutta
 */
import java.util.*;

public class Matrix<E> {
     private LinkedList<LinkedList<E>> matrix;

    public Matrix(){
        matrix = new LinkedList();
    }

    public LinkedList<LinkedList<E>> getMatrix(){
        return matrix;
    }

    public void setMatrix(LinkedList<LinkedList<E>> tMatrix){
        matrix = tMatrix;
    }

    public void addLastField(){
        for(int i = 0; i < matrix.size(); i ++){
            matrix.get(i).addLast(null);
        }
        matrix.addLast(createList(matrix.size() + 1));
    }

    public void addFirstField(){
        for(int i = 0; i < matrix.size(); i++){
            matrix.get(i).addFirst(null);
        }
        matrix.addFirst(createList(matrix.size() + 1));
    }

    public void join(Matrix<E> matrix2){
        Integer tsize = this.getMatrix().size();
        for(int i = 0; i < matrix2.getMatrix().size(); i++){
            this.addLastField();
        }
        for(int i = 0; i < matrix2.getMatrix().size(); i++)
            for(int j = 0; j < matrix2.getMatrix().get(i).size(); j++){
                this.getMatrix().get(tsize + i).set(tsize + j, matrix2.getMatrix().get(i).get(j));
            }
    }

    public void merge(Matrix<E> matrix2){
        Integer tsize = this.getMatrix().size();
        for(int i = 1; i < matrix2.getMatrix().size(); i++){
            this.addLastField();
        }
        for(int i = 1; i < matrix2.getMatrix().size(); i++)
            for(int j = 0; j < matrix2.getMatrix().get(i).size(); j++){
                this.getMatrix().get(tsize + i - 1).set(tsize + j - 1, matrix2.getMatrix().get(i).get(j));
            }
        for(int i = 1; i < matrix2.getMatrix().get(0).size(); i++){
            this.getMatrix().get(tsize - 1).set(tsize + i - 1, matrix2.getMatrix().get(0).get(i));
        }
    }

    public void setElement(Integer m, Integer n, E e){
        matrix.get(m).set(n, e);
    }

    public E getElement(Integer m, Integer n){
        return matrix.get(m).get(n);
    }

    private LinkedList<E> createList(Integer tsize){
        LinkedList<E> templist = new LinkedList();
        for (int i = 0; i < tsize; i++){
            templist.add(null);
        }
        return templist;
    }
}
